//
// Created by PC on 2024/8/7.
// 这道题的复杂版本见 202406 gesp五级题
/*
 *OJ: https://www.luogu.com.cn/problem/B4005 PASS
 * 使用的暴力枚举, 因为数据范围小, 可以通过, 优化方案是用前缀和
 *题目描述

小杨有一个 n 行 m 列的网格图，其中每个格子要么是白色，要么是黑色。对于网格图中的一个子矩形，小杨认为它是平衡的当且仅当其中黑色格子与白色格子数量相同。小杨想知道最大的平衡子矩形包含了多少个格子。
输入格式

第一行包含两个正整数 n,m，含义如题面所示。

之后 n 行，每行一个长度为 m 的 01 串，代表网格图第 i 行格子的颜色，如果为 0，则对应格子为白色，否则为黑色。
输出格式

输出一个整数，代表最大的平衡子矩形包含格子的数量，如果不存在则输出 0。
输入输出样例
输入 #1

4 5
00000
01111
00011
00011

输出 #1

16

说明/提示

【样例解释】

对于样例 1，假设 (i,j) 代表第 i 行第 j 列，最大的平衡子矩形的四个顶点分别为 (1,2),(1,5),(4,2),(4,5)

【数据范围】
3.1.6 数据范围
 20% n,m<=10
 40% n=1,1<=m<=100
 40% n,m<=100
对于全部数据，保证有 1≤n,m≤10

 * */

#include <iostream>

using namespace std;

int main()
{
    int n, m,ret=0;
    cin >> n >> m;
    int netmap[101][101] = {0};
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= m; ++j)
        {
            char t;
            cin >> t;
            netmap[i][j] = t-'0';
//            if (t == '0')
//                netmap[i][j] = 0;
//            else
//                netmap[i][j] = 1;
        }
    }
    //top left
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= m; ++j)
        {
            //bottom right
            for (int ii = i; ii <= n; ++ii)
            {
                for (int jj = 1; jj <= m; ++jj)
                {
                    // 遍历左上角的i,j,到右下角的ii,jj,数一数有多少1和0
                    int black=0,white=0;
                    for (int x = i; x <= ii ; ++x)
                    {
                        for (int y = j; y <= jj ; ++y)
                        {
                            if (netmap[x][y]==0) ++white;
                            if (netmap[x][y]==1) ++black;
                        }
                    }
                    if(black==white)
                    {
                        ret=max(ret,(ii-i+1)*(jj-j+1));
                    }
                }
            }
        }
    }
    cout<<ret;
    return 0;
}
